package com.demo.java.OD51_100.OD71;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【入栈出栈】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145614671
 */
public class OdMain {
    public static void main(String[] args) {
        try {
            // 创建扫描器对象读取输入
            Scanner s = new Scanner(System.in);
            String inputValues = s.nextLine(); // 读取一行输入

            // 解析输入的字符串，按空格分隔成单独的值
            String[] strs = inputValues.split(" ");

            // 输入的数据长度限制，如果超过100个元素则输出错误
            if (strs.length > 100) {
                System.out.println("input data error");
                return;
            }

            // 创建列表来存储解析后的整数
            List<Integer> myList = new ArrayList<>();
            // 将字符串数组转换为整数并加入到列表中
            for (String string : strs) {
                myList.add(Integer.parseInt(string));
            }

            boolean hasChange = true; // 标志，用来指示是否发生了变动

            // 重复执行操作，直到列表中只剩下一个元素
            while (myList.size() != 1 && hasChange) {
                hasChange = false; // 初始化为没有变动

                // 遍历列表，尝试进行操作
                for (int j = 1; j < myList.size(); ++j) {
                    int n = j; // 当前遍历的位置
                    int num = myList.get(j); // 当前数字
                    boolean isEnd = false; // 标志，指示是否结束检查
                    int count = 0; // 用来计算累加和

                    // 循环累加前面的元素，直到找到一个匹配的条件
                    while (!isEnd) {
                        --n; // 向前查找
                        count += myList.get(n); // 累加当前元素

                        // 如果找到了合适的条件，执行替换操作
                        if (num == count) {
                            // 移除从 n 到 j+1 之间的所有元素
                            myList.subList(n, j + 1).clear();
                            // 在 n 位置插入新的值，即 2 * num
                            myList.add(n, 2 * num);
                            hasChange = true; // 标记发生了变动
                            break; // 跳出当前循环
                        }

                        // 如果到达了列表的开头或者累加和已经大于目标数字，则结束查找
                        if (n == 0 || count > num) {
                            isEnd = true;
                        }
                    }

                    // 如果发生了变动，则退出外层循环
                    if (hasChange) {
                        break;
                    }
                }
            }

            // 输出最终的列表，逆序输出元素
            StringBuilder sb = new StringBuilder();
            for (int j = myList.size() - 1; j >= 0; --j) {
                sb.append(myList.get(j)); // 将每个元素追加到 StringBuilder
                if (j != 0) { // 在元素之间添加空格
                    sb.append(" ");
                }
            }

            // 打印最终的结果
            System.out.print(sb);
        } catch (Exception e) {
            // 捕获并输出异常信息，处理输入错误
            e.printStackTrace();
            System.out.println("input error");
        }
    }
}